package fr.u.psud.polytech.controller;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import fr.u.psud.polytech.database.Action;
import fr.u.psud.polytech.database.Entrepot;
import fr.u.psud.polytech.database.HibernateUtil;
import fr.u.psud.polytech.database.Produit;
import fr.u.psud.polytech.database.StockProduit;
import fr.u.psud.polytech.database.User;
 

public class EntrepotManager {
	public EntrepotManager() {
		super();
	}

	public void addEntrepot(String nom, String ville,Integer capacite) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// début de la transaction
			trns = session.beginTransaction();
			// création de l'entrepot
			
//			
			Entrepot e = new Entrepot();
			e.setNom(nom);
			e.setVille(ville);
			e.setCapacite(capacite);
			
			session.save(e);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (Exception e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}
	
	public void  addProduit(Integer quantite, Entrepot entrepot, Produit produit){
		Transaction trns = null;
		boolean found =false;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			StockProduit sp = null;
			Set<StockProduit> stockList = entrepot.getStockEntrepot();
						
			Iterator<StockProduit> it = stockList.iterator();
			
			while(it.hasNext() && ! found){
				sp = it.next();
				if(sp.getProduit().getId()==produit.getId() && sp.getEntrepot().getId() == entrepot.getId()){
					found=true;
				}
			}
			
			trns = session.beginTransaction();
			
			if(found){
				sp.setQuantite(sp.getQuantite()+quantite);
				session.update(sp);
			}
			else{
				sp = new StockProduit();
				sp.setEntrepot(entrepot);
				sp.setProduit(produit);
				sp.setQuantite(quantite);
				session.save(sp);
			}
			
			
			
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}

	public Entrepot getEntrepot(String nom)
	{
		Entrepot e= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			trns = session.beginTransaction();
			Query query = session.createQuery("from Entrepot where nom='"+nom+"'");
			List<Entrepot> entpList= query.list();
			if(!entpList.isEmpty()){
				e = entpList.get(0);
			}
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
		return e;
	}
	
	public Entrepot getEntrepot(Integer id) {
		Entrepot e = null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			trns = session.beginTransaction();
			e = (Entrepot) session.get(Entrepot.class, id);
			session.getTransaction().commit();
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return e;
	}
	

	public List<Entrepot> getEntrepots(){
		List<Entrepot> EntrepotList= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query query = session.createQuery("from Entrepot");

			EntrepotList= query.list();
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return EntrepotList;
	}


	public List<Entrepot> getEntrepots(int pageNumber, int pageSize){
		List<Entrepot> EntrepotList= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query query = session.createQuery("from Entrepot");
			query = query.setFirstResult(pageSize * (pageNumber - 1));
			query.setMaxResults(pageSize);
			EntrepotList= query.list();
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return EntrepotList;
	}



	public void deleteEntrepot(Integer id) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// création de l'entrepot
			Entrepot e = getEntrepot(id);
			// début de la transaction
			trns = session.beginTransaction();

			session.delete(e);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}

	public void addProduit(Produit p) {

	}

	public static void main(String args[]) {
		EntrepotManager ent = new EntrepotManager();
		
		ent.addEntrepot("Entp 1", "La Rochelle",100);
	}

//	public void updateEntrepot(String ent_id,int capacite,int [] prod_id) {
//		Transaction trns = null;
//		// ouverture de la session
//		Session session = HibernateUtil.getSessionFactory().openSession();
//		try {
//			// dÃ©but de la transaction
//			trns = session.beginTransaction();
//			Entrepot ent = (Entrepot) session.get(Entrepot.class, ent_id);
//						
//			//Creation de la nouvelle liste d'action associée a l'utilsateur
//			Set<StockProduit> stockList = new HashSet<StockProduit>();
//			
//			if(prod_id !=null){
//				for(int i=0; i<prod_id.length;i++)
//				{
//					stockList.add(new ActionManager().getAction(act_id[i]));
//				}
//			}
//			//Ajout de l'entrepot et de la liste des actions a l'utilisateur
//			user.setEntrepot(entp);
//			user.setListAction(userAction);
//			
//			//Mise a jour des données
//			session.update(user);
//			session.getTransaction().commit();
//		}
//		// gestion des exceptions s'il y'en a
//		catch (RuntimeException e) {
//			if (trns != null) {
//				trns.rollback();
//			}
//			e.printStackTrace();   
//		} 
//	}
}
